home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include "defs.h"
-
- har *progname;
- har *filename;
- ixrect *pr1, *pr2;
- nt old_level, old_window;
- nt max_level, min_level;
- nt lower, upper;
- nt table[10000];
- nt window, level;
-
- #ifdef STANDALONE
- ain(argc, argv, envp)
- #else
- inlev_main(argc, argv, envp)
- #endif
- int argc;
- char **argv;
- char **envp;
- {
- register int i, j;
- int levels;
- float winlev_calc_mean();
- colormap_t colormap;
-
- window = level = -1;
- progname = strsave(argv[0]);
- parse_profile(&argc, argv, envp);
-
- while ((gc = getopt(argc, argv, "w:l:")) != EOF)
- switch (gc) {
- case 'w':
- window = atoi(optarg);
- break;
- case 'l':
- level = atoi(optarg);
- break;
- case '?':
- errflag++;
- break;
- }
-
- if (errflag)
- error((char *) 0, "Usage: %s: [-w window] [-l level] [infile] [outfile]\n", progname);
-
- for (stream = 0; optind < argc; stream++, optind++)
- if (stream < 2 && strcmp(argv[optind], "-") != 0)
- if (freopen(argv[optind], mode[stream], f[stream]) == NULL)
- error("%s %s", PR_IO_ERR_INFILE, argv[optind]);
-
- if ((pr1 = pr_load(stdin, &colormap)) == NULL)
- error(PR_IO_ERR_RASREAD);
-
- if (bitrestrict)
- levels = calc_max(pr1)+1;
- else
- levels = MAXLEVEL(pr1->pr_depth);
-
- if (window == -1)
- window = MAXLEVEL(8) * 2;
- if (level == -1)
- level = (int) winlev_calc_mean(pr1);
-
- if (level > levels || level < 0)
- error("level setting outside range of levels in image");
-
- if (window > levels || window < 0)
- error("window setting outside range of levels in image");
-
- if ((pr2 = mem_create(pr1->pr_size.x, pr1->pr_size.y, 8)) == NULL)
- error("mem_create returned NULL");
-
- min_level = 0;
- max_level = levels;
- old_window = levels;
- old_level = levels / 2;
- setuptable();
- winlev_convert_to_8bits(pr1, pr2);
-
- pr_dump(pr2, stdout, &colormap, RT_STANDARD, 0);
- }
- /* initialise lookup table for current window & level */
- etuptable()
- {
- register int i;
- register int *t;
- register int new_lower, new_upper;
- int old_lower, old_upper;
- double m, cumulative_greylevel;
-
- if (window != 0)
- m = 253. / (float) window; /* 253 = No. greylevels * - 1 */
-
- cumulative_greylevel = 1.;
- new_lower = level - window / 2;
- new_upper = level + window / 2;
- old_lower = old_level - old_window / 2;
- old_upper = old_level + old_window / 2;
-
- lower = MIN(old_lower, new_lower);
- upper = MAX(old_upper, new_upper);
-
- lower = 0;
- upper = max_level;
- t = &table[lower];
- for (i = lower; i < upper; i++)
- if (i <= new_lower)
- *t++ = 1;
- else if (i >= new_upper)
- *t++ = 254;
- else {
- *t++ = cumulative_greylevel;
- cumulative_greylevel += m;
- }
- old_level = level;
- old_window = window;
- }
-
- inlev_convert_to_8bits(in, out)
- Pixrect *in, *out;
- {
- short *ptr16;
- int *ptr32;
- char *ptr8;
- register int i;
- int n;
- int mode = TRUE;
-
- #define ALL_PIXELS TRUE
-
- ptr8 = (char *) mpr_d(out)->md_image;
- n = in->pr_size.x * in->pr_size.x;
-
- switch (in->pr_depth) {
- case 16:
- ptr16 = (short *) mpr_d(in)->md_image;
- for (i = 0; i < n; i++) {
- if ((mode == ALL_PIXELS) || ((*ptr16 >= lower) && (*ptr16 <= upper)))
- *ptr8 = *(table + (*ptr16));
- ptr8++;
- ptr16++;
- }
- break;
- case 32:
- ptr32 = (int *) mpr_d(in)->md_image;
-
- for (i = 0; i < n; i++) {
- if ((mode == ALL_PIXELS) || ((*ptr32 >= lower) && (*ptr32 <= upper)))
- *ptr8 = *(table + (*ptr32));
- ptr8++;
- ptr16++;
- }
- break;
- }
- }
-
-
- loat
- inlev_calc_mean(pr)
- Pixrect *pr;
- {
- register int i, j;
- int sum;
-
- sum = 0;
- for (j = 0; j < pr->pr_size.y; j++)
- for (i = 0; i < pr->pr_size.x; i++)
- sum += pr_get(pr, i, j);
-
- return (sum / (pr->pr_size.x * pr->pr_size.y));
- }
-